package client;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.HashSet;
import java.util.List;

import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import DTO.ResumeAnnonceDTO;
import DTO.VendeurDTO;

/**
 * Classe décrivant la fenêtre "Gestion de compte".
 * 
 * @author Julien Dubois
 * @version 1.0 (Mai 2012)
 * 
 */
@SuppressWarnings("serial")
public class ClientFenetreGestionDeCompte extends JFrame implements ActionListener, WindowListener
{
	//DECLARATION DES VARIABLES DE LA CLASSE 
	
	/**
	 * Panel général de fond.
	 */
	private JPanel grandPanel= new JPanel();
	
	/**
	 * Panel principal contenant nos éléments.
	 */
	private JPanel panel;
	
	/**
	 * Layouts choisis pour agencer nos éléments.
	 */
	private BorderLayout borderLayoutPrincipal;
	private FlowLayout flowLayout;
	private GridLayout gridLayoutAnnonces ;
	
	/**
	 * ScrollPane pour avoir la scrollBar.
	 */
	private JScrollPane scrollPanel ;
	
	/**
	 * Bouton's de notre fenêtre.
	 */
	private JButton modifierInfoMonCompte, supprimerMonCompte, btnValider, btnRetour, btnModifier  ;
	
	/**
	 * JOptionPane pour les pop-up. 
	 */
	private JOptionPane jop, jop2 ; 
	
	/**
	 * Int's de la fenêtre.
	 */
	private int option, option2, idVendeur;
	
	/**
	 * Instance du vendeur courant.
	 */
	private VendeurDTO vendeur ;
	
	/**
	 * Panel utile pour l'affichage des annonces en rapport avec le vendeur.
	 */
	private JPanel panelIntermediaire ;
	
	/**
	 * HashSet qui va stocker les annonces à supprimer.
	 */
	private HashSet<Integer> idsASupprimer;
	
	/**
	 * Booleen de notre fenêtre.
	 */
	//le booleen quitter sert à assurer proprement la fermeture de la connexion avec le serveur. 
	private boolean quitter = true;
	
	
	
	//CONSTRUCTEUR DE LA FENETRE
	
	/**
	 * Constructeur par défaut.
	 */
	public ClientFenetreGestionDeCompte()
	{
		/*
		 * Va nous pemettre d'utiliser this.dispose pour disposer d'un fenêtre quand on en a plus besoin (pour la fermer)
		 * Ce bout de code sert à fermer la connexion avec le serveur proprement (pas de message d'erreur) lorsque l'on clique sur la croix rouge.
		 */
		this.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent arg0)
			{
				if(quitter)
				{
					ClientCommunication.getInstance().fermerConnexion();
				}
			}
		});
		
		this.setTitle("Petites Annonces - Gesttion de compte");
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.setVisible(true);

		
		//on définit la taille de la fenêtre
		//600x660 pour respecter au mieux la taille de l'image d'accueil.
		this.setSize(600,660);
		
		
		//On n'empêche le redimensionnement.
		this.setResizable(false);
		
		
		//On colore le panel dans un gris sympathique et soyeux.
		grandPanel.setBackground(Color.LIGHT_GRAY);
		this.setContentPane(grandPanel);
		
		
		//BorderLayout pour agencer nos éléments.
		borderLayoutPrincipal = new BorderLayout();
		this.setLayout(borderLayoutPrincipal);
		
		
		
		//PERSONNALISATION DE LA FENETRE A PARTIR DICI 
		
		
		//FlowLayout pour agencer nos éléments.
		flowLayout = new FlowLayout();
		
		
		//Association Layout <-> Panel + CENTER + couleur.
		panel = new JPanel();
		panel.setLayout(flowLayout);
		this.getContentPane().add(panel, BorderLayout.CENTER);
		panel.setBackground(Color.LIGHT_GRAY);

		
		
		// ON DISPOSE DES ELEMENTS DE NOTRE FENETRE DANS panel
		
		//on récupère le prenom et le nom du vendeur.
		String prenom_vendeur = ClientCommunication.getInstance().getVendeurStocke().getPrenom() ;
		String nom_vendeur = ClientCommunication.getInstance().getVendeurStocke().getNom();
		
		
		//Premier element un JLabel de rappelle [Prenom]+[Nom].
		JLabel jlabel1 = new JLabel("Compte de " + prenom_vendeur + " " + nom_vendeur);
		jlabel1.setPreferredSize(new Dimension(155, 20));
		panel.add(jlabel1);
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide1 = new JLabel();
		espacevide1.setPreferredSize(new Dimension(140, 30));
		panel.add(espacevide1);
		
		
		//Bouton - "Modifier mes informations personnelles"
		modifierInfoMonCompte = new JButton("Modifier mes informations personnelles");
		modifierInfoMonCompte.setPreferredSize(new Dimension(270, 30));
		modifierInfoMonCompte.addActionListener(this);
		panel.add(modifierInfoMonCompte);
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide2 = new JLabel();
		espacevide2.setPreferredSize(new Dimension(300, 30));
		panel.add(espacevide2);
		
		
		//Bouton "Supprimer mon compte".
		supprimerMonCompte = new JButton("Supprimer mon compte");
		supprimerMonCompte.setPreferredSize(new Dimension(270, 30));
		supprimerMonCompte.addActionListener(this);
		panel.add(supprimerMonCompte);
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide3 = new JLabel();
		espacevide3.setPreferredSize(new Dimension(800, 30));
		panel.add(espacevide3);
		
		
		//Label message d'information.
		JLabel jlabel2 = new JLabel("Récapitulatif de vos annonces :");
		panel.add(jlabel2);
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide4 = new JLabel();
		espacevide4.setPreferredSize(new Dimension(395, 30));
		panel.add(espacevide4);
		
		
		//Affichage du panel.
		panel.setVisible(true);
		
		
		//AFFICHAGE DES ANNONCES EN RAPPORT AVEC LE VENDEUR
		
		//id_vendeur contient l'id du vendeur courant.
		int id_vendeur = ClientCommunication.getInstance().getVendeurStocke().getId();
		//on récupère toutes les annonces 
		List<ResumeAnnonceDTO> listeAnnoncesAssocieesVendeur = 
				ClientCommunication.getInstance().recupererAnnoncesVendeur(id_vendeur);
		
		
		//on utilise un GridLayout pour afficher les annonces.
		gridLayoutAnnonces = new GridLayout();
		gridLayoutAnnonces.setColumns(3);
		gridLayoutAnnonces.setRows(listeAnnoncesAssocieesVendeur.size()+1);

		//panel qui reçoit les panel Head1 - Head2 - Head3.
		panelIntermediaire = new JPanel();		
		panelIntermediaire.setLayout(gridLayoutAnnonces);
		panelIntermediaire.setBackground(Color.LIGHT_GRAY);
		panelIntermediaire.setMaximumSize(new Dimension(400, 400));

		
		JPanel panelHead1 = new JPanel();
		panelHead1.add(new JLabel("Date"));
		panelHead1.setPreferredSize(new Dimension(180, 30));
		panelHead1.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		panelHead1.setBackground(Color.LIGHT_GRAY);
		
		JPanel panelHead2 = new JPanel();
		panelHead2.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		panelHead2.setBackground(Color.LIGHT_GRAY);
		panelHead2.add(new JLabel("Annonces"));
		JPanel panelHead3 = new JPanel();
		
		panelHead3.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		panelHead3.setBackground(Color.LIGHT_GRAY);
		panelHead3.add(new JLabel("Supprimer"));
		
		panelIntermediaire.add(panelHead1);
		panelIntermediaire.add(panelHead2);
		panelIntermediaire.add(panelHead3);
		
		
		//Panel scrollable.
		scrollPanel = new JScrollPane(panelIntermediaire);
		scrollPanel.setMinimumSize(new Dimension(400, 50));
		scrollPanel.setMaximumSize(new Dimension(400, 400));
		scrollPanel.setPreferredSize(new Dimension(570, 430));
		scrollPanel.setWheelScrollingEnabled(true);
		panel.add(scrollPanel);

		
		//Panel qui va accueillir la checkBox et le bouton "Modifier" dans la troisème colonne.
		JPanel jpanel = null ; 
 

		//AFFICHAGE DES ANNONCES GRACE A UNE BOUCLE FOR DE LA MORT.
			for (final ResumeAnnonceDTO resume1 : listeAnnoncesAssocieesVendeur)
			{
				jpanel = new JPanel() ;
				jpanel.add(new JLabel(resume1.getDate().toString()));
				jpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
				jpanel.setBackground(Color.LIGHT_GRAY);
				panelIntermediaire.add(jpanel);
				
				jpanel = new JPanel();
				JTextArea labelTitre = new JTextArea(resume1.getTitre().toString());
				labelTitre.setLineWrap(true);
				labelTitre.setPreferredSize(new Dimension(170, 30));
				labelTitre.setEditable(false);
				labelTitre.setFocusable(false);
				labelTitre.setBackground(Color.LIGHT_GRAY);
				jpanel.add(labelTitre);
				jpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
				jpanel.setBackground(Color.LIGHT_GRAY);
				panelIntermediaire.add(jpanel);

				idsASupprimer = new HashSet<Integer>() ;

		        class StateListener implements ActionListener
		        {
		        	//ici c'est une petite technique de bg pour ajouter dans idsASupprimer uniquement que les id des annonces cochées par l'utilisateur
		        	//le principe : on va checker à chaque clic l'état du bouton et si c'est true on le met dans un HashSet (empechant les doublons).
		        	int id = resume1.getId();
	                public void actionPerformed(ActionEvent e)
	                	{
	                        System.out.println("source : " + ((JCheckBox)e.getSource()).getText() + " - état : " + ((JCheckBox)e.getSource()).isSelected());
	                        Boolean var = (Boolean)((AbstractButton) e.getSource()).isSelected();
	                        if (var == true)
	                        {
	                        	idsASupprimer.add(id);
	                        }
	                        if (var == false)
	                        {
	                        	idsASupprimer.remove(id);
	                        }
		            	}              
		        }
				
		        //Déclaation de la checkBox.
				JCheckBox cb = null ;
				cb = new JCheckBox();
				cb.addActionListener(new StateListener());
				cb.setBackground(Color.lightGray);
					

				
				jpanel = new JPanel() ; 
				jpanel.add(cb);
				panelIntermediaire.add(jpanel);
				jpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
				jpanel.setBackground(Color.LIGHT_GRAY);
		        btnModifier = new JButton("Modifier");
		        btnModifier.setPreferredSize(new Dimension(80,30));
		        btnModifier.addActionListener(this);
				jpanel.add(btnModifier);
				jpanel.add(cb);	

				//Action sur le bouton "Modifier" présent dnas la troisème colonne.
				btnModifier.addActionListener(new ActionListener()
				{
					public void actionPerformed(ActionEvent arg0)
					{
						int idAModifier = resume1.getId();
						ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreModifierAnnonce", idAModifier);
						dispose();
					}
				});
				

			}
		
		//Déclaration de nos deux boutons de bas de page.	
		btnRetour = new JButton("Retour");
		btnRetour.setPreferredSize(new Dimension(80,30));
		btnRetour.addActionListener(this);
		panel.add(btnRetour);
		
		btnValider = new JButton("Valider");
		btnValider.setPreferredSize(new Dimension(80,30));
		btnValider.addActionListener(this);
		panel.add(btnValider);			
	}
	
	
	// ACTIONS SUR LES BOUTONS
	
	@SuppressWarnings("static-access")
	public void actionPerformed(ActionEvent arg0)
	{
		Object event = arg0.getSource();
		
		//Clique sur le bouton "Modifier..."
		if(event == modifierInfoMonCompte)	
		{
			quitter = false;
			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreModificationInfoPerso");
			this.dispose();
		}
		
		//Clique sur le bouton "Supprimer..." -> déclenche un Pop-up.
		if(event == supprimerMonCompte)
		{
			jop = new JOptionPane();
			option = jop.showConfirmDialog(null, "Etes-vous sûr de vouloir supprimer votre compte ?", "Petites Annonces - !!!", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
			
			if (option == JOptionPane.OK_OPTION)
			{
				//on supprime le compte
				vendeur = ClientCommunication.getInstance().getVendeurStocke();
				idVendeur = vendeur.getId();
				ClientCommunication.getInstance().supprimerVendeur(idVendeur);
				
				
				//retour vers la page d'accueil
				quitter = false;
				ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreAccueilMessageErreur");
				this.dispose();
			}
			else
			{
				//la boite de dialogue se ferme solo, il n'y a rien à faire.
				System.out.println("clic sur non");
			}
		}
		
		//Clique sur le bouton "Retour..."
		if(event == btnRetour)
		{
			quitter = false;
			ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreUneFoisConnecte");
			this.dispose();
		}
		
		//Clique sur le bouton "Valider..."
		if (event == btnValider)
		{
			if (idsASupprimer.isEmpty())
			{
				System.out.println("On fait rien.");
			}
			else
			{
				jop2 = new JOptionPane();
				option2 = jop2.showConfirmDialog(null, "Etes-vous sûr de vouloir supprimer les annonces sélectionnées ?", "Petites Annonces - !!!", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
				
				if (option2 == JOptionPane.OK_OPTION)
				{
					for (Integer i : idsASupprimer)
					{
						ClientCommunication.getInstance().supprimerAnnonce(i);		
					}
					
					quitter = false;
					ClientCommunication.getInstance().creerFenetre(grandPanel, "fenetreGestionDeCompte");
					this.dispose();
				}
				else
				{
					System.out.println("clic sur non");
				}
			}
		}
	}


	//Méthodes implémentées de WindowListener, on ne les utilisent pas.

	@Override
	public void windowActivated(WindowEvent e)
	{
		
	}




	@Override
	public void windowClosed(WindowEvent e)
	{
		
	}




	@Override
	public void windowClosing(WindowEvent e)
	{
		
	}




	@Override
	public void windowDeactivated(WindowEvent e)
	{
		
	}




	@Override
	public void windowDeiconified(WindowEvent e)
	{
		
	}




	@Override
	public void windowIconified(WindowEvent e)
	{
		
	}




	@Override
	public void windowOpened(WindowEvent e)
	{
		
	}

}
